package com.huanxing.cloud.mall.api.handler.impl;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.extra.servlet.ServletUtil;
import com.huanxing.cloud.common.core.entity.Result;
import com.huanxing.cloud.common.core.util.IpUtils;
import com.huanxing.cloud.mall.api.handler.LoginHandler;
import com.huanxing.cloud.mall.common.dto.UserLoginDTO;
import com.huanxing.cloud.mall.common.entity.UserInfo;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

public abstract class AbstractLoginHandler implements LoginHandler {

	@Override
	public Result<UserInfo> login(HttpServletRequest request, UserLoginDTO userLoginDTO) {
		// 参数检查
		validateRequest(userLoginDTO);
		// 初始化租户 只有微信支付宝小程序需要通过appid初始化租户
		before(userLoginDTO);
		// 登录
		UserInfo userInfo = doLogin(userLoginDTO);
		//
		if (null != userLoginDTO.getShareUserNumber()) {
			userInfo.setShareUserNumber(userLoginDTO.getShareUserNumber());
			// 分销关系绑定
			distributionBindUser(userInfo);
		}
		// 后置处理
		postLogin(request, userInfo);
		return Result.success(userInfo);
	}

	public abstract UserInfo doLogin(UserLoginDTO userLoginDTO);

	private void validateRequest(UserLoginDTO userLoginDTO) {
		// 参数检查
	}

	private void postLogin(HttpServletRequest request, UserInfo userInfo) {
		// 后置处理 获取用户地址
		// 获取ip
		String ip = ServletUtil.getClientIP(request);
		Map<String, String> maps = IpUtils.getWhoisCity(ip);
		if (ObjectUtil.isNotNull(maps)) {
			UserInfo user = new UserInfo();
			user.setId(userInfo.getId());
			user.setProvince(maps.get("province"));
			userInfo.setCity(maps.get("city"));
			// 修改用户
			updateUser(userInfo);
		}
	}

}
